<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Vinculo_Perfil_Menu_Model extends CI_Model {

	public function __construct()
	{
		parent::__construct();
		
		include_once 'app/enum/EnumTipoPerfil.php';
	}
	
	public function inserir($data){
	
		$retorno = $this->db->insert('tb_vinculoperfilmenu', $data);
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao inserir o Vinculo do Perfil com o Menu. Favor tentar novamente mais tarde.');
		}else{
			if($this->db->affected_rows() > 0){
				return $this->db->insert_id();
			}
		}
	}
	
	public function alterar($data, $id){
	
		$this->db->where('idVinculoPerfilMenu', $id);
		$retorno = $this->db->update('tb_vinculoperfilmenu', $data);
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao alterar o Vinculo do Perfil com o Menu. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	public function excluir($id){
	
		$this->db->where('idVinculoPerfilMenu', $id);
		$retorno = $this->db->delete('tb_vinculoperfilmenu');
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao excluir o Vinculo do Perfil com o Menu. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	public function excluirPorIdMenu($idMenu){
	
		$this->db->where('idMenu', $idMenu);
		$retorno = $this->db->delete('tb_vinculoperfilmenu');
	
		if(!$retorno){
			throw new Exception('Ocorreu um erro ao excluir o Vinculo do Perfil com o Menu. Favor tentar novamente mais tarde.');
		}else{
			return true;
		}
	}
	
	function obter($id){
	
		$sql = "select *
				from tb_vinculoperfilmenu
				where idVinculoPerfilMenu = ".$id;
	
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
			$obj = $query->result();
			
			return $obj[0];
		}else{
			return null;
		}
	}
	
	function listarMenuPaiPorPerfil($idPerfil){
		
		$sql = "select vpm.idVinculoPerfilMenu,
					   vpm.idMenu,
					   vpm.idMenuPai,
				       me.descricao,
					   me.classe,
				       me.imgMenu,
					   me.menuRestrito
				from tb_vinculoperfilmenu as vpm
					inner join tb_menu as me on (me.idMenu = vpm.idMenu)
				where vpm.idPerfil = ".$idPerfil."
				and vpm.idMenuPai is null
				order by vpm.ordem";
		
		$query = $this->db->query($sql);
		
		return $query->result();
		
	}
	
	function listarMenuFilhoPorIdMenuPai($idPerfil, $idMenu){
	
		$sql = "select vpm.idVinculoPerfilMenu,
					   vpm.idMenu,
					   vpm.idMenuPai,
				       me.descricao,
					   me.classe,
				       me.imgMenu,
					   me.menuRestrito
				from tb_vinculoperfilmenu as vpm
					inner join tb_menu as me on (me.idMenu = vpm.idMenu)
				where vpm.idPerfil = ".$idPerfil."
				and vpm.idMenuPai = ".$idMenu."
				order by vpm.ordem";
		
		$query = $this->db->query($sql);
	
		return $query->result();
	
	}
	
	function validaPermissaoRegistro($idPerfil, $classe, $metodo){
		
		$sql = "select *
				from tb_vinculoperfilmenu as vpm
					inner join tb_vpmfuncionalidade as vpmFun on (vpmFun.idVinculoPerfilMenu = vpm.idVinculoPerfilMenu )
					inner join tb_funcionalidade as fun on (fun.idFuncionalidade = vpmFun.idFuncionalidade)
					inner join tb_menu as me on (me.idMenu = fun.idMenu)
				where 1 = 1
					and vpm.idPerfil = ".$idPerfil."
				    and trim(me.classe) = '".$classe."'
				    and trim(fun.metodo) = '".$metodo."'";
		
		$query = $this->db->query($sql);
		
		if($query->num_rows() > 0){
			$obj = $query->result();
			
			return $obj[0];
		}else{
			return null;
		}
		
	}
	
	public function validaUsuarioPermissaoAcessarModulo($idPerfil, $classe, $tipoPerfil){
		
		$sql = "select vpm.*
				from tb_vinculoperfilmenu as vpm
					inner join tb_menu as me on (me.idMenu = vpm.idMenu)
				WHERE 1 = 1
					  and vpm.idPerfil = ".$idPerfil."
				  	  and me.classe= '".$classe."' ";
		
		if (!empty($tipoPerfil)){
			if ((int)$tipoPerfil !== (int)EnumTipoPerfil::getCodigo(EnumTipoPerfil::ADMINISTRADOR_FULL)){
				$sql .= "and menuRestrito = 'N' ";
			}
		}else{
			$sql .= "and menuRestrito = 'N' ";
		}
		
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
			return true;
		}else{
			return false;
		}
	
	}
	
	/**
	 * Obtem o vinculo atráves do idPerfil e do idMenu
	 * @param unknown $idPerfil
	 * @param unknown $idMenu
	 * @return NULL
	 */
	
	public function obterVinculoPorPerfilIdMenu($idPerfil, $idMenu){
	
		$sql = "select vpm.*, me.*
				from tb_vinculoperfilmenu as vpm
					inner join tb_menu as me on (me.idMenu = vpm.idMenu)
				where vpm.idPerfil = ".$idPerfil."
					and vpm.idMenu = ".$idMenu;
	
		$query = $this->db->query($sql);
	
		if($query->num_rows() > 0){
			$obj = $query->result();
			
			return $obj[0];
		}else{
			return null;
		}
	}
	
	public function obterMenuPaiPorClassePerfil ($classe, $idPerfil){
		$sql = "select vpm.*, me.* 
				from tb_menu as me
					inner join tb_vinculoperfilmenu as vpm on (vpm.idMenu = me.idMenu)
				where me.classe = '".$classe."' 
					and vpm.idPerfil = ".$idPerfil ;
		
		$query = $this->db->query($sql);
		
		if($query->num_rows() > 0){
			$obj = $query->result();
				
			return $obj[0];
		}else{
			return null;
		}
	}
	
	public function listarVinculoPorMenu($idMenu){
		
		$sql = "select *
				from tb_vinculoperfilmenu
				where idMenu = ".$idMenu;
		
		$query = $this->db->query($sql);
		
		return $query->result();		
	}
	
	public function listarVinculoPorMenuPai($idMenu){
	
		$sql = "select *
				from tb_vinculoperfilmenu
				where idMenuPai = ".$idMenu;
	
		$query = $this->db->query($sql);
	
		return $query->result();
	}
	
	/**
	 * Busca os Menus sem vinculos
	 * @param unknown $idPerfil
	 */
	
	public function listarMenuSemVinculoPorPerfil($idPerfil, $tipoPerfil = null){
		
		$sql = "SELECT me.*
				FROM tb_menu as me 
					left join tb_vinculoperfilmenu as vpm on (vpm.idMenu = me.idMenu and vpm.idPerfil = ".$idPerfil.")
				where vpm.idVinculoPerfilMenu is null ";
		
		if (!empty($tipoPerfil)){
			if ((int)$tipoPerfil !== (int)EnumTipoPerfil::getCodigo(EnumTipoPerfil::ADMINISTRADOR_FULL)){
				$sql .= "and me.menuRestrito = 'N' ";
			}
		}
		
		$sql .= "order by me.descricao ";
		
		$query = $this->db->query($sql);
		
		return $query->result();
	}
	
}